/*
已知学生类含有实例属性(姓名、学号、成绩)，实例方法（构造方法、getter方法)。
建立字符文件a.txt，第一行为一个整数(表示学生人数)，第二行开始，每行提供一个学生所需的实例属性值。
编写程序1，从a.txt输入学生人数和学生信息，建立学生数组。
将所有学生数组各元素写入二进制文件a.dat(a.dat的开头4字节为表示学生数的整数)。
编写程序2，从a.dat读出学生数据输出为字符文件b.txt(输入出格式同a.txt)。
编写程序3读入a.dat数据，用随机文件方式删除成绩<60分的学生记录并存回a.dat。
（程序2用于检查程序1和程序2的结果是否正确）
 */
//程序3
import java.io.*;
import java.util.*;
import java.text.*;
public class Demo0503 {
    public static void main(String[] args) throws Exception{
        String aTxtFile = "C:\\Users\\98317\\Desktop\\JavaExerciseCode\\exci07\\src\\a.txt";
        String bTxtFile = "C:\\Users\\98317\\Desktop\\JavaExerciseCode\\exci07\\src\\b.txt";
        String DatFile = "C:\\Users\\98317\\Desktop\\JavaExerciseCode\\exci07\\src\\a.dat";
        // 重写a.dat
        Scanner cin = new Scanner(new File(aTxtFile));
        // RandAccessFile只有"rw"和"r"，没有"w"
        RandomAccessFile oos = new RandomAccessFile(DatFile, "rw");

        int N = cin.nextInt();
        oos.writeInt(N);
        for (int i = 0; i < N; ++i) {
            oos.writeUTF(cin.next());
            oos.writeUTF(cin.next());
            oos.writeFloat(cin.nextFloat());
        }
        cin.close();
        oos.close();

        //删除
        RandomAccessFile raf = new RandomAccessFile(DatFile, "rw");
        N = raf.readInt();//读取学生人数
        int M = 0; //成绩大于60的人数
        //获取成绩大于60的人数
        for (int i = 0; i < N; ++i) {
            String name = raf.readUTF();
            String number = raf.readUTF();
            float score = raf.readFloat();
            if (score < 60)
                continue;
            M++;
        }
        //修改a.dat文件
        long r = 0, w = 0; //r为读的当前指针，w为写入的当前指针
        //读
        raf.seek(0); //指定从文件起始位置开始的指针偏移量，即从头开始
        raf.readInt(); //从文件中读取一个带符号位的整数
        r = raf.getFilePointer(); //获取RandomAccessFile流中的当前读指针
        //写
        raf.seek(0);
        raf.writeInt(M); //写入大于60的学生人数
        w = raf.getFilePointer(); //获取RandomAccessFile流中的当前写指针
        //写入大于60的学生信息
        for (int i = 0; i < N; ++i) {
            raf.seek(r); //定位到读指针的位置
            String name = raf.readUTF();
            String number = raf.readUTF();
            float score = raf.readFloat();
            r = raf.getFilePointer();

            if (score < 60)
                continue;
            raf.seek(w);//定位到写指针的位置
            //写入
            raf.writeUTF(name);
            raf.writeUTF(number);
            raf.writeFloat(score);
            w = raf.getFilePointer();//获取RandomAccessFile流中的当前写指针
        }
        raf.setLength(w); //设置此文件的长度
        raf.close();

        //写入到"b.txt"
        RandomAccessFile ois = new RandomAccessFile(DatFile, "r");
        PrintWriter pw = new PrintWriter(new BufferedOutputStream(new FileOutputStream(bTxtFile)));
        //写入大于60的学生人数
        N = ois.readInt();
        pw.printf("%d\r\n", N);
        //写入大于60的学生信息
        for (int i = 0; i < N; ++i) {
            //读入dat文件的信息
            String name = ois.readUTF();
            String number = ois.readUTF();
            Float score = ois.readFloat();
            DecimalFormat fmt= new DecimalFormat("##.##");//数字格式化
            //写入b.txt文件
            pw.println(name + " " + number + " " + fmt.format(score));
        }
        System.out.println("成功修改a.dat文件和b.txt！");
        ois.close();
        pw.close();
    }
}
